// FileSystem/file-stream-manager.js

import fs from 'fs';
import path from 'path';
import { promisify } from 'util';

// 将回调式方法转换为Promise形式
const readFile = promisify(fs.readFile);
const writeFile = promisify(fs.writeFile);
const unlink = promisify(fs.unlink);
const stat = promisify(fs.stat);
const mkdir = promisify(fs.mkdir);

/**
 * 文件流管理器
 * 提供基本的文件上传、更新、查询、删除功能
 * 支持动态设置存储路径，易于扩展
 */
export default class FileStreamManager {
  /**
   * 构造函数
   * @param {Object} options 配置选项
   * @param {string} options.baseDir 基础存储目录，默认为process.cwd()
   */
  constructor(options = {}) {
    this.baseDir = options.baseDir || process.cwd();
  }

  /**
   * 设置/更新基础存储目录
   * @param {string} dirPath 新的基础目录路径
   */
  setBaseDir(dirPath) {
    this.baseDir = dirPath;
  }

  /**
   * 获取文件的完整路径
   * @param {string} filePath 相对路径
   * @returns {string} 完整路径
   */
  getFullPath(filePath) {
    return path.join(this.baseDir, filePath);
  }

  /**
   * 确保目录存在，不存在则创建
   * @param {string} dirPath 目录路径
   */
  async ensureDirectoryExists(dirPath) {
    try {
      await stat(dirPath);
    } catch (err) {
      if (err.code === 'ENOENT') {
        await mkdir(dirPath, { recursive: true });
      } else {
        throw err;
      }
    }
  }

  /**
   * 上传/保存文件
   * @param {string} filePath 文件存储路径（相对于baseDir）
   * @param {Buffer|string} fileData 文件数据
   * @returns {Promise<string>} 存储的文件路径
   */
  async upload(filePath, fileData) {
    const fullPath = this.getFullPath(filePath);
    const dirPath = path.dirname(fullPath);
    
    await this.ensureDirectoryExists(dirPath);
    await writeFile(fullPath, fileData);
    
    return filePath;
  }

  /**
   * 更新文件内容
   * @param {string} filePath 文件路径（相对于baseDir）
   * @param {Buffer|string} newData 新文件数据
   * @returns {Promise<string>} 文件路径
   */
  async update(filePath, newData) {
    const fullPath = this.getFullPath(filePath);
    await writeFile(fullPath, newData);
    return filePath;
  }

  /**
   * 读取文件内容
   * @param {string} filePath 文件路径（相对于baseDir）
   * @returns {Promise<Buffer>} 文件内容
   */
  async read(filePath) {
    const fullPath = this.getFullPath(filePath);
    return await readFile(fullPath);
  }

  /**
   * 删除文件
   * @param {string} filePath 文件路径（相对于baseDir）
   * @returns {Promise<void>}
   */
  async delete(filePath) {
    const fullPath = this.getFullPath(filePath);
    await unlink(fullPath);
  }

  /**
   * 检查文件是否存在
   * @param {string} filePath 文件路径（相对于baseDir）
   * @returns {Promise<boolean>}
   */
  async exists(filePath) {
    try {
      const fullPath = this.getFullPath(filePath);
      await stat(fullPath);
      return true;
    } catch (err) {
      if (err.code === 'ENOENT') {
        return false;
      }
      throw err;
    }
  }
}